# 데이터베이스의 구성
# 데이터베이스의 정의
정의
데이터베이스는 일정한 규칙, 혹은 규약을 통해 구조화되어 저장되는 데이터의 모음입니다.
- 통합된 데이터(Integrated Data)
- 자료의 중복을 배제한 데이터의 모임입니다.
- 저장된 데이터(Stored Data)
- 컴퓨터가 접근할 수 있는 저장 매체에 저장된 자료입니다.
- 운영 데이터(Operational Data)
- 조직의 고유한 업무를 수행하는 데 존재 가치가 확실하고 없어서는 안 될 반드시 필요한 자료입니다.
- 공용 데이터(Shared Data)
- 여러 응용 시스템들이 공동으로 소유하고 유지하는 자료입니다.
# 데이터베이스의 특징
- 실시간 접근성(Real-Time Accessibility)
- 수시적이고 비정형적인 질의(조회)에 대하여 실시간 처리에 의한 응답이 가능해야 합니다.
- 계속적인 변화(Continuous Evolution)
- 데이터베이스의 상태는 동적입니다. 즉 새로운 데이터의 삽입(Insert),삭제(Delete),갱신(Update)로 항상 최신의 데이터를 유지합니다.
- 동시공용(Concurrent Sharing)
- 데이터베이스는 서로 다른 목적을 가진 여러 응용자들을 위한 것이므로 다수의 사용자가 동시에 같은 내용의 데이터를 이용할 수 있어야 합니다.
- 내용에 의한 참조(Content Reference)
- 데이터베이스에 있는 데이터를 참조할 때 데이터 레코드의 주소나 위치에 의해서가 아니라, 사용자가 요구하는 데이터 내용으로 데이터를 찾습니다.
- 데이터베이스 위에 DBMS, DBMS 위에 응용프로그램이 있으며, 해당 구조를 기반으로 데이터를 주고 받습니다.
- 데이터베이스를 제어, 관리하는 통합 시스템을 DBMS(DataBase Management System)이라고 합니다.
# 엔터티 (Entity)
정의
엔터티는 사람, 장소, 물건, 사건, 개념 등 여러개의 속성을 지닌 명사를 의미합니다.
# 약한 엔터티와 강한 엔터티
- A가 혼자서는 존재하지 못하고 B의 존재 여부에 따라 종속적이라면 A는 약한 엔터티이고 B는 강한 엔터티입니다.
- 예로, 방은 건물 안에만 존재하기에 방은 약한 엔터티, 건물은 강한 엔터티가 됩니다.
# 릴레이션 (Relation)
정의
릴레이션은 데이터베이스에서 정보를 구분하여 저장하는 기본 단위입니다.
- 엔터티에 관한 데이터를 데이터베이스는 릴레이션 하나에 담아서 관리합니다.
- 릴레이션은 관계형 데이터베이스에서는 테이블이라고 하며, NoSQL 데이터베이스에서는 '컬렉션'이라고 합니다.
# 테이블과 컬렉션
데이터베이스는 관계형 데이터베이스와 NoSQL 데이터베이스로 구분할 수 있습니다.
- MySQL의 구조는 레코드 - 테이블 - 데이터베이스로 구성되어 있습니다.
- MongoDB의 구조는 도큐먼트 - 컬렉션 - 데이터베이스로 구성되어 있습니다.
# 속성 (Attribute)
정의
속성은 릴레이션에서 관리하는 구체적이며 고유한 이름을 갖는 정보입니다.
- 서비스의 요구 사항을 기반으로 관리해야 할 필요가 있는 속성들만 엔터티의 속성이 됩니다.
# 도메인 (Domain)
정의
도메인이란 릴레이션에 포함된 각각의 속성들이 가질 수 있는 값의 집합을 말합니다.
- 예로 성별이라는 속성의 도메인은 [남, 여]라는 집합입니다.
# 필드와 레코드
- 테이블에 쌓이는 행 당위의 데이터를 레코드라고 하며, 튜플이라고도 부릅니다.
# 필드 타입
# 숫자 타입
# 날짜 타입
- DATE
- 3바이트
- 1000-01-01 ~ 9999-12-31
- DATETIME
- 8바이트
- 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
- TIMESTAMP
- 4바이트
- 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07
# 문자 타입
- CHAR & VARCHAR
- CHAR는 고정 길이 문자열 입니다.
- VARCHAR 가변 길이 문자열 입니다.
- 10글자를 저장할 경우, 10글자 바이트 + 길이 기록용 1바이트 = 총 11바이트를 사용합니다.
- CHAR는 검색에 유리하고, VARCHAR는 유동적인 길이를 가진 데이터를 저장할 때 적합합니다.
- TEXT & BLOB
- 두 타입 모두 큰 데이터를 저장할 때 사용합니다.
- TEXT는 큰 문자열 저장에 사용하며, 게시판 본문 저장용으로 사용됩니다.
- BLOB은 이미지, 동영상 등 큰 데이터 저장에 사용합니다.
- 근데 일반적으로 S3에 저장해서 URL을 VARCHAR로 저장합니다.
- ENUM & SET
- 두 타입 모두 문자열 열거 타입입니다.
- ENUM은
ENUM('남자', '여자')
형태로 쓰이며, 단일 선택만 가능합니다.- 이 중에 없는 갑을 삽입할 경우 빈 문자열이 삽입됩니다.
- 0, 1로 매핑되어 메모리를 적게 사용하며, 최대 65,535개의 요소를 넣을 수 있습니다.
- SET은 여러개의 데이터를 사용할 수 있으며, 비트 단위 연산이 가능합니다.
- 최대 64개의 요소를 넣을 수 있습니다.
- ENUM과 SET을 사용 할 경우 공간적으로 이점을 볼 수 있지만 애플리케이션 수정에 따라 해당 목록을 수정해야 한다는 단점이 있습니다.
# 관계
데이터베이스의 여러개의 테이블은 서로의 관계가 정의되어 있습니다.
# One to One 관계
- 테이블 A의 로우와 테이블 B의 로우가 정확히 일대일 매칭이 되는 관계를 one to one 관계라고 합니다.
- 1:1 관계는 테이블을 두개의 테이블로 나워 테이블의 구조를 더 이해하기 쉽게 만들어 줍니다.
# One To Many
- 테이블 A의 로우가 테이블 B의 여러 로우와 연결이 되는 관계를 one to many 관계라고 합니다.
- 한 개의 개체가 다른 많은 개체를 포함하는 관계입니다.
# Many To Many
- 테이블 A의 여러 로우가 테이블 B의 여러 로우와 연결이 되는 관계를 many to many 라고 합니다.
- N:M 테이블 두개를 직접적으로 연결해서 구축하지 않고, 1:N, 1:M이란 관계를 갖는 테이블 두개로 나눠서 설계합니다.
# 키 (Key)
정의
테이블 간의 관계를 조금 더 명확하게 하고, 테이블 자체의 인덱스를 위해 설정된 장치입니다.
용어
유일성 : 중복되는 값이 없음
최소성 : 필드를 조합하지 않고 필드만 써서 키를 형성할 수 있는 것
# 기본키 (Primary key)
- 기본키는 PK라고 줄여 사용하기도 하며, 유일성과 최소성을 만족하는 키입니다.
- 테이블에서 기본키는 오직 1개만 지정할 수 있으며, NULL 값과 중복된 값을 가질 수 없습니다.
- 기본키는 자연키 또는 인조키 중에 골라 설정합니다.
# 자연키
- 중복된 값들을 제외하며 중복되지 않는 것들을 자연스레 추출하다가 나온 키를 자연키라고 합니다.
- 언젠가는 변하는 속성을 지닙니다.
# 인조키
- 인위적으로 아이디를 부여하여, 만들어지는 식별자를 말합니다.
- 자연키와는 대조적으로 변하지 않기에, 보통 기본키는 인조키로 설정합니다.
# 외래키 (Foreign Key)
- 외래키는 FK라고 줄여 사용하기도 하며, 다른 테이블의 기본키를 그대로 참조하는 값입니다.
- 개체와의 관계를 식별하는데 사용되며, 외래키는 중복되어도 괜찮습니다.
- 참조되는 부모테이블이 먼저 생성된 뒤 데이터를 넣고, 참조하는 자식 테이블이 다음에 생겨야 합니다.
- 부모테이블이 삭제되면 자식테이블은 참조하는 것이 없어지기 때문에 외래키 오류가 발생하므로, 자식테이블 먼저 삭제한 후 부모테이블을 삭제해야 합니다.
# 슈퍼 키(Super Key)
- 각 레코드를 유일하게 식별할 수 있는 유일성을 만족하는 키입니다.
# 후보 키(Candidate key)
- 기본키가 될 수 있는 후보들이며, 유일성과 최소성을 만족하는 키입니다.
# 대체 키(Alternate key)
- 후보 키가 두개 이상일 경우 어느 하나를 기본 키로 지정하고 남은 후보키를 말합니다.